#!/bin/bash
# filepath: /Users/aibokalv/Mycode/typing_pc_nuxt/scripts/deploy.sh
# 部署脚本：构建应用、启动PM2服务、同步OSS

set -e

# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 配置变量
APP_NAME="ai_pc_nuxt"
PORT=20222
PM2_ECOSYSTEM="ecosystem.config.js"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"

echo -e "${BLUE}🚀 开始部署 $APP_NAME...${NC}"
echo -e "${YELLOW}📍 项目路径: $PROJECT_ROOT${NC}"

# 检查部署模式
if [[ "$SKIP_OSS" == "1" ]]; then
    echo -e "${YELLOW}⏭️  跳过 OSS 上传模式${NC}"
    OSS_MODE="skip"
elif [[ "$AUTO_CONFIRM" == "1" ]]; then
    echo -e "${YELLOW}🤖 自动确认 OSS 上传模式${NC}"
    OSS_MODE="auto"
else
    echo -e "${YELLOW}👤 手动确认 OSS 上传模式${NC}"
    OSS_MODE="manual"
fi

# 切换到项目根目录
cd "$PROJECT_ROOT"

# 检查必要的工具
echo -e "${YELLOW}🔧 检查必要工具...${NC}"

# 检查 pnpm
if ! command -v pnpm &> /dev/null; then
    echo -e "${RED}❌ 错误: pnpm 未安装${NC}"
    exit 1
fi

# 检查 pm2
if ! command -v pm2 &> /dev/null; then
    echo -e "${RED}❌ 错误: pm2 未安装${NC}"
    echo -e "${YELLOW}💡 安装 pm2: npm install -g pm2${NC}"
    exit 1
fi

echo -e "${GREEN}✅ 工具检查通过${NC}"

# 清理旧的构建文件
echo -e "${YELLOW}🗑️  清理旧的构建文件...${NC}"
rm -rf .nuxt .output

# 安装依赖
echo -e "${YELLOW}📦 安装依赖...${NC}"
pnpm install

# 构建应用
echo -e "${YELLOW}🔨 构建应用...${NC}"
echo -e "   执行命令: pnpm run build:cdn"

if pnpm run build:cdn; then
    echo -e "${GREEN}✅ 应用构建成功${NC}"
else
    echo -e "${RED}❌ 应用构建失败${NC}"
    exit 1
fi

# 创建 PM2 配置文件 (针对 4核8G 服务器优化)
echo -e "${YELLOW}⚙️  创建 PM2 配置...${NC}"
echo -e "${BLUE}💻 服务器配置: 4核8G 优化${NC}"

cat > "$PM2_ECOSYSTEM" << EOF
module.exports = {
  apps: [{
    name: '$APP_NAME',
    port: $PORT,
    exec_mode: 'cluster',
    instances: 1, // 4核保留1核给系统，使用1个实例
    script: './.output/server/index.mjs',
    env: {
      NODE_ENV: 'production',
      PORT: $PORT,
      NITRO_PORT: $PORT,
      HOST: '0.0.0.0'
    },
    error_file: './logs/err.log',
    out_file: './logs/out.log',
    log_file: './logs/combined.log',
    time: true,
    max_memory_restart: '2G', // 8G内存，每个实例限制2G
    node_args: '--max-old-space-size=2048', // 2GB heap
    min_uptime: '10s',
    max_restarts: 5,
    restart_delay: 4000,
    // 性能优化
    kill_timeout: 5000,
    listen_timeout: 3000,
    // 健康检查
    health_check_grace_period: 3000
  }]
}
EOF

echo -e "${GREEN}✅ PM2 配置文件已创建${NC}"
echo -e "${YELLOW}📊 PM2 配置详情:${NC}"
echo -e "   实例数: 3 (保留1核给系统)"
echo -e "   内存限制: 2GB/实例"
echo -e "   总内存使用: ~6GB (预留2GB给系统)"

# 创建日志目录
mkdir -p logs

# 停止旧的 PM2 进程
echo -e "${YELLOW}🛑 停止旧的 PM2 进程...${NC}"
pm2 delete "$APP_NAME" 2>/dev/null || echo -e "${YELLOW}   没有找到旧进程${NC}"

# 启动 PM2 服务
echo -e "${YELLOW}🚀 启动 PM2 服务...${NC}"
echo -e "   应用名称: $APP_NAME"
echo -e "   运行端口: $PORT"
echo -e "   执行模式: cluster (3 实例)"

if pm2 start "$PM2_ECOSYSTEM"; then
    echo -e "${GREEN}✅ PM2 服务启动成功${NC}"
else
    echo -e "${RED}❌ PM2 服务启动失败${NC}"
    exit 1
fi

# 保存 PM2 配置
pm2 save

# 检查服务状态
echo -e "${YELLOW}🔍 检查服务状态...${NC}"
pm2 status "$APP_NAME"

# 等待服务完全启动
echo -e "${YELLOW}⏳ 等待服务启动...${NC}"
sleep 8

# 健康检查
echo -e "${YELLOW}🏥 健康检查...${NC}"
if curl -f -s "http://localhost:$PORT" > /dev/null; then
    echo -e "${GREEN}✅ 服务健康检查通过${NC}"
    echo -e "${GREEN}🌐 应用已在 http://localhost:$PORT 运行${NC}"
else
    echo -e "${RED}❌ 服务健康检查失败${NC}"
    echo -e "${YELLOW}💡 查看日志: pm2 logs $APP_NAME${NC}"
fi

# OSS 同步逻辑
if [[ "$OSS_MODE" == "skip" ]]; then
    echo -e "${YELLOW}⏭️  跳过 OSS 同步 (SKIP_OSS=1)${NC}"
    OSS_STATUS="已跳过"
elif [[ "$OSS_MODE" == "auto" ]]; then
    echo -e "${YELLOW}🤖 自动执行 OSS 同步...${NC}"
    OSS_SCRIPT="$SCRIPT_DIR/oss-async.sh"
    
    if [ -f "$OSS_SCRIPT" ]; then
        export AUTO_CONFIRM=1
        if chmod +x "$OSS_SCRIPT" && bash "$OSS_SCRIPT"; then
            echo -e "${GREEN}✅ OSS 同步完成${NC}"
            OSS_STATUS="已完成 (自动)"
        else
            echo -e "${RED}❌ OSS 同步失败${NC}"
            echo -e "${YELLOW}💡 请检查 OSS 配置和网络连接${NC}"
            exit 1
        fi
    else
        echo -e "${RED}❌ 错误: OSS 同步脚本不存在: $OSS_SCRIPT${NC}"
        exit 1
    fi
else
    echo -e "${YELLOW}👤 手动执行 OSS 同步...${NC}"
    OSS_SCRIPT="$SCRIPT_DIR/oss-async.sh"
    
    if [ -f "$OSS_SCRIPT" ]; then
        if chmod +x "$OSS_SCRIPT" && bash "$OSS_SCRIPT"; then
            echo -e "${GREEN}✅ OSS 同步完成${NC}"
            OSS_STATUS="已完成 (手动)"
        else
            echo -e "${RED}❌ OSS 同步失败${NC}"
            echo -e "${YELLOW}💡 请检查 OSS 配置和网络连接${NC}"
            exit 1
        fi
    else
        echo -e "${RED}❌ 错误: OSS 同步脚本不存在: $OSS_SCRIPT${NC}"
        exit 1
    fi
fi

# 显示部署总结
echo ""
echo -e "${BLUE}📋 部署总结${NC}"
echo -e "${GREEN}===============================================${NC}"
echo -e "✅ 应用名称: $APP_NAME"
echo -e "✅ 运行端口: $PORT"
echo -e "✅ 访问地址: http://localhost:$PORT"
echo -e "✅ PM2 实例: 3 个 (4核8G优化)"
echo -e "✅ 内存配置: 2GB/实例"
echo -e "✅ PM2 状态: $(pm2 jlist | jq -r ".[] | select(.name==\"$APP_NAME\") | .pm2_env.status" 2>/dev/null || echo "运行中")"
echo -e "✅ OSS 同步: $OSS_STATUS"
echo -e "${GREEN}===============================================${NC}"

echo ""
echo -e "${YELLOW}📌 常用命令:${NC}"
echo -e "   查看日志: ${BLUE}pm2 logs $APP_NAME${NC}"
echo -e "   重启服务: ${BLUE}pm2 restart $APP_NAME${NC}"
echo -e "   停止服务: ${BLUE}pm2 stop $APP_NAME${NC}"
echo -e "   删除服务: ${BLUE}pm2 delete $APP_NAME${NC}"
echo -e "   监控面板: ${BLUE}pm2 monit${NC}"

echo ""
echo -e "${GREEN}🎉 部署完成!${NC}"